param(
		[string]$Prompt = "test"
	 )

# 生成聊天完成
# POST /api/chat
# 使用提供的模型在聊天中生成下一条消息。这是一个流式处理终结点，因此将有一系列响应。可以使用"stream": false.最终响应对象将包含来自请求的统计信息和其他数据。

# 参数
# model：（必需）模型名称
# messages：聊天的消息，可用于保存聊天记录
# tools：JSON 中供模型使用的工具列表（如果支持）
# 这messageobject 具有以下字段：

# role：消息的角色system,user,assistant或tool
# content：消息的内容
# images（可选）：要包含在消息中的图像列表（对于多模态模型，例如llava)
# tool_calls（可选）：模型要使用的 JSON 中的工具列表
# 高级参数（可选）：

# format：返回响应的格式。格式可以是json或 JSON 架构。
# options：Modelfile 文档中列出的其他模型参数，例如temperature
# stream：如果false响应将作为单个响应对象返回，而不是对象流
# keep_alive：控制模型在请求后加载到内存中的时间（默认值：5m)
# 结构化输出
# 通过在format参数。该模型将生成与架构匹配的响应。请参阅下面的 Chat request （Structured outputs） 示例。

# 示例
# 聊天请求 （流式处理）
# 请求
# 发送包含流式响应的聊天消息。

# curl http://localhost:11434/api/chat -d '{
#   "model": "llama3.2",
#   "messages": [
#     {
#       "role": "user",
#       "content": "why is the sky blue?"
#     }
#   ]
# }'
# 响应
# 返回 JSON 对象流：

# {
#   "model": "llama3.2",
#   "created_at": "2023-08-04T08:52:19.385406455-07:00",
#   "message": {
#     "role": "assistant",
#     "content": "The",
#     "images": null
#   },
#   "done": false
# }
# 最终回应：

# {
#   "model": "llama3.2",
#   "created_at": "2023-08-04T19:22:45.499127Z",
#   "done": true,
#   "total_duration": 4883583458,
#   "load_duration": 1334875,
#   "prompt_eval_count": 26,
#   "prompt_eval_duration": 342546000,
#   "eval_count": 282,
#   "eval_duration": 4535599000
# }

function Invoke-ChatStream {
 	param(
		[string]$Uri = "http://localhost:11434/v1/chat",
		[string]$Model = "deepseek-r1:latest",
		[string]$Prompt = "test"
		)

	Add-Type -AssemblyName System.Net.Http
	$client = [System.Net.Http.HttpClient]::new()
	$client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json")
	$request = [System.Net.Http.HttpRequestMessage]::new(
			[System.Net.Http.HttpMethod]::Post,
			$Uri
			)
	$body = @{
		model = $Model
		messages = @(
				@{ role = "system"; content = "You are a helpfull assistant." }
				@{ role = "user"; content = "$Prompt" }
				)
		stream = $true
	} | ConvertTo-Json
	$request.Content = [System.Net.Http.StringContent]::new(
			$body,
			[System.Text.Encoding]::UTF8,
			"application/json"
			)
	$requestBody = $request.Content
	# Write-Host "requestBody: " -NoNewline
	# Write-Host $requestBody
	Write-Host "<<< Request <<< " 
	Write-Host $request
	Write-Host "--- End of Request --- " 
	# 流式接收
	$response = $client.SendAsync(
			$request,
			[System.Net.Http.HttpCompletionOption]::ResponseHeadersRead
			).Result
	$stream = $response.Content.ReadAsStreamAsync().Result
	$reader = [System.IO.StreamReader]::new($stream)
	# 实时输出
	try {
		Write-Host ">>> Response >>> " 
		$done = $false
		Write-Host "Output: " -NoNewline
		while (-not $reader.EndOfStream -and -not $done) {
			$line = $reader.ReadLine()
			if ($line) {
				Write-Host -NoNewline $line
				$json = $line 
				$done = $json.done
				Write-Host -NoNewline $json.response
			}
		}
		Write-Host "--- End of Response --- " 
	} finally {
		$reader.Dispose()
		$client.Dispose()
	}
}

$response = Invoke-ChatStream -Prompt $Prompt


